package com.zzyl.common.utils;

import java.time.LocalDate;
import java.time.Period;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

public class AgeCalculator {

    /**
     * 根据18位身份证号计算周岁年龄
     * @param idCard 18位身份证号码
     * @return 周岁年龄（无效输入返回-1）
     */
    public static int calculateAge(String idCard) {
        // 基础校验
        if (idCard == null || idCard.length() != 18) {
            return -1;
        }

        try {
            // 截取出生日期部分（7-14位）
            String birthDateStr = idCard.substring(6, 14);
            
            // 解析出生日期
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd");
            LocalDate birthDate = LocalDate.parse(birthDateStr, formatter);
            
            // 校验日期有效性（避免类似20230229的非法日期）
            if (!birthDateStr.equals(birthDate.format(formatter))) {
                return -1;
            }
            
            // 获取当前日期
            LocalDate currentDate = LocalDate.now();
            
            // 计算周岁年龄（未过生日则减1岁）
            return Period.between(birthDate, currentDate).getYears();
            
        } catch (DateTimeParseException | IndexOutOfBoundsException e) {
            return -1; // 日期解析失败或格式错误
        }
    }

    public static void main(String[] args) {
        // 测试用例
        String[] testIds = {
            "110105199001012345", // 正常日期
            "110105200002293456", // 闰年日期
            "110105202313014567", // 非法日期
            "12345678",           // 长度错误
            null                  // 空值
        };

        for (String id : testIds) {
            int age = calculateAge(id);
            System.out.println("身份证: " + id + " | 年龄: " + 
                (age >= 0 ? age + "周岁" : "无效身份证号"));
        }
    }
}